home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 October: Mac OS SDK / Dev.CD Oct 96 SDK / Dev.CD Oct 96 SDK1.toast / Development Kits (Disc 1) / AppleScript / Development Tools / Sample Code / 7Edit 3.1 / Sources / SVAESave.c < prev    next >
Encoding:
Text File  |  1995-11-20  |  3.8 KB  |  160 lines  |  [TEXT/CWIE]

  1. // SVAESave.c
  2. //
  3. // 7Edit 3.1d1. Original version by Jon Lansdell and Nigel Humphreys.
  4. // 3.1 updates by Greg Sutton.
  5. // ©Apple Computer Inc 1995, all rights reserved.
  6.  
  7. #include "SVAESave.h"
  8.  
  9. #include "SVEditAEUtils.h"
  10. #include "SVEditWindow.h"        // for DPtrFromWindowPtr()
  11. #include "SVEditFile.h"            // for DoSave() etc…
  12.  
  13.  
  14. // -----------------------------------------------------------------------
  15. //    Name:             DoSaveWindow
  16. //    Purpose:        Handles the Save AppleEvent.
  17. // -----------------------------------------------------------------------
  18.  
  19. #pragma segment File
  20.  
  21. pascal OSErr DoSaveWindow(const AppleEvent    *theAppleEvent,
  22.                                 AppleEvent    *reply,
  23.                                 long        handlerRefCon)
  24. #pragma unused (reply, handlerRefCon)
  25.  
  26.     AEDesc            directObj = {typeNull, NULL};
  27.     Size            actualSize;
  28.     DescType        returnedType;
  29.     FSSpec            destFSSpec;
  30.     
  31.     WindowToken        aWindowToken;
  32.     OSErr            err;
  33.     
  34.         // pick up the direct object
  35.     err = AEGetParamDesc(theAppleEvent, keyDirectObject, typeWildCard, &directObj);
  36.                                                  
  37.         // pick up optional destination param, if any
  38.     if (noErr != AEGetParamPtr(theAppleEvent, keyAEDestination, typeFSS, &returnedType,
  39.                                         (Ptr)&destFSSpec, sizeof(destFSSpec), &actualSize))
  40.     {
  41.         destFSSpec.vRefNum = 0;
  42.         destFSSpec.parID = 0;
  43.     }
  44.  
  45.     err = GotRequiredParams(theAppleEvent);
  46.     if (noErr != err) goto done;
  47.     
  48.     if (typeNull != directObj.descriptorType)
  49.         err = SaveDesc(&directObj, &destFSSpec);
  50.     else if (FrontWindow())
  51.     {
  52.         aWindowToken.tokenWindow = FrontWindow();
  53.     
  54.         err = SaveWindowToken(&aWindowToken, &destFSSpec);
  55.     }
  56.     else
  57.         err = errAENoSuchObject;
  58.   
  59. done:
  60.     if (directObj.dataHandle) 
  61.         AEDisposeDesc(&directObj);
  62.             
  63.     return(err);
  64. }    // DoSaveWindow
  65.  
  66.  
  67. OSErr    SaveWindowToken(WindowToken* theToken, FSSpec* destFSSpec)
  68. {
  69.     DPtr            docPtr;
  70.     OSErr            err;
  71.     
  72.     docPtr = DPtrFromWindowPtr(theToken->tokenWindow);
  73.     
  74.     if (! docPtr)
  75.         return(errAENoSuchObject);
  76.  
  77.     if (docPtr->everSaved == false && ! destFSSpec->vRefNum && ! destFSSpec->parID) 
  78.         return(kAEGenericErr);        // Never been saved and no destination to save
  79.     
  80.     if (destFSSpec->vRefNum || destFSSpec->parID)    // We were given a destination
  81.         err = DoSave(docPtr, *destFSSpec);
  82.     else
  83.         err = SaveUsingTemp(docPtr);
  84.  
  85.     return(err);
  86. }
  87.  
  88.  
  89. OSErr    SaveWindowDesc(AEDesc* windowDesc, FSSpec* destFSSpec)
  90. {
  91.     WindowToken        aWindowToken;
  92.     Size            actualSize;
  93.     OSErr            err;
  94.  
  95.     if (typeMyWndw != windowDesc->descriptorType)
  96.         return(errAETypeError);
  97.         
  98.     GetRawDataFromDescriptor(windowDesc, (Ptr)&aWindowToken, sizeof(aWindowToken), &actualSize);
  99.  
  100.     err = SaveWindowToken(&aWindowToken, destFSSpec);
  101.     
  102.     return(err);
  103. }
  104.  
  105.  
  106. OSErr    SaveDesc(AEDesc* aDesc, FSSpec* destFSSpec)
  107. {
  108.     AEDesc        saveDesc = {typeNull, NULL},
  109.                 windowDesc = {typeNull, NULL},
  110.                 itemDesc = {typeNull, NULL};
  111.     long        itemCount,
  112.                 index;
  113.     DescType    theAEKeyword;
  114.     OSErr        err;
  115.     
  116.     if (typeObjectSpecifier == aDesc->descriptorType)
  117.         err = AEResolve(aDesc, kAEIDoMinimum, &saveDesc);
  118.     else
  119.         err = AEDuplicateDesc(aDesc, &saveDesc);
  120.         
  121.     if (noErr != err) goto done;
  122.     
  123.     switch (saveDesc.descriptorType)
  124.     {
  125.         case typeAEList:
  126.             err = AECountItems(&saveDesc, &itemCount);
  127.             if (noErr != err) goto done;
  128.             
  129.             for (index = 1; index <= itemCount; index++)    // Do front back order
  130.             {
  131.                 err = AEGetNthDesc(&saveDesc, index, typeWildCard, &theAEKeyword, &itemDesc);
  132.                 if (noErr != err) goto done;
  133.                 
  134.                 err = SaveDesc(&itemDesc, destFSSpec);        // Call recursively
  135.                 if (noErr != err) goto done;
  136.  
  137.                 if (itemDesc.dataHandle)
  138.                     AEDisposeDesc(&itemDesc);
  139.             }
  140.             break;
  141.             
  142.         default:
  143.             err = AECoerceDesc(&saveDesc, typeMyWndw, &windowDesc);
  144.             if (noErr != err) goto done;
  145.             err = SaveWindowDesc(&windowDesc, destFSSpec);
  146.     }
  147.     
  148. done:
  149.     if (saveDesc.dataHandle)
  150.         AEDisposeDesc(&saveDesc);
  151.     if (windowDesc.dataHandle)
  152.         AEDisposeDesc(&windowDesc);
  153.     if (itemDesc.dataHandle)
  154.         AEDisposeDesc(&itemDesc);
  155.     
  156.     return(err);
  157. }
  158.  
  159.